package ru.compft.web.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import ru.compft.common.data.Module;
import ru.compft.common.services.ModuleService;
import ru.compft.common.utils.GlobalConstants;
import ru.compft.web.WebConst;
import ru.compft.web.adapter.ModuleAdapter;
import ru.compft.web.beans.ModuleBean;
import ru.compft.web.security.validator.ModuleValidator;
import ru.compft.web.utils.FacesUtils;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ComponentSystemEvent;
import javax.servlet.ServletRequest;
import java.io.Serializable;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 14.06.12
 * Time: 13:43
 * Контроллер для управления доступными модулями системы
 */
@ManagedBean(name = WebConst.MODULES_CONTROLLER)
@SessionScoped
public class ModulesController implements Serializable {
    private static final long serialVersionUID = 3183713069283644633L;

    private static final Logger logger = LoggerFactory.getLogger(ModulesController.class);

    private List<Module> allModules;

    public List<Module> getAllModules() {
        if (allModules == null) setAllModules(new LinkedList<Module>());
        return allModules;
    }

    public void setAllModules(List<Module> allModules) {
        this.allModules = allModules;
    }

    public int getAllModulesSize() {
        return getAllModules().size();
    }

    /**
     * Список всех доступных модулей для приложения
     *
     * @return
     */
    public void initModuleList(ComponentSystemEvent event) {
//        System.out.println(" ++++++++++++++++++++++++ initModuleList");
        final ModuleService moduleService = (ModuleService) FacesUtils.getSpringBean(WebConst.MODULE_SERVICE);
        final List<Module> allModules = moduleService.getAllModules();

        final List<Module> result = new LinkedList<Module>();
        // возвращаем только те модули, у которых стоит признак visible
        if (!CollectionUtils.isEmpty(allModules)) {
            for (Module module : allModules) {
                if (module.isVisible()) result.add(module);
            }
        }

        // todo убрать хардкод
//        Module module = new Module(1L, "admin", "Админка-хардкод", "/admin", "", true, 1);
//        result.add(module);

        // Сортируем оставшиеся модули по полю order
        Collections.sort(result);
        setAllModules(result);
    }

    public String getModuleById() {
        final ServletRequest servletRequest = (ServletRequest) FacesUtils.getExternalContext().getRequest();
        final String moduleBeanId = servletRequest.getParameter("moduleBeanId");

        final ModuleBean moduleBean = (ModuleBean) FacesUtils.getBackingBean(WebConst.MODULE_BEAN);

        if (moduleBean != null && StringUtils.hasText(moduleBeanId)) {
            Long id = 0L;
            try {
                id = Long.valueOf(moduleBeanId);
            } catch (NumberFormatException e) {
                logger.error("Module bean Id = " + moduleBeanId, e);
            }
            final ModuleService modulesService = (ModuleService) FacesUtils.getSpringBean(WebConst.MODULE_SERVICE);
            final Module module = modulesService.getModuleById(id);
            if (module != null) {
                ModuleAdapter.copyToModuleBean(module, moduleBean);
                return GlobalConstants.SUCCESS;
            }
        }
        return GlobalConstants.FAILURE;
    }

    public String cancel() {
        return GlobalConstants.SUCCESS;
    }

    public void editModule() {
        final ModuleBean moduleBean = (ModuleBean) FacesUtils.getBackingBean(WebConst.MODULE_BEAN);

        // получаем сервис работы с модулями
        if (moduleBean != null) {
            if (moduleBean.getId() == null) {
                // такого быть здесь не должно. Выходим из метода
                // todo сделать через файл messages
                FacesUtils.addErrorMessage(null, "Ошибка при редактировании модуля");
                return;
            }
            // валидация
            if (!ModuleValidator.isValid(moduleBean)) {
                // todo сделать через файл messages
                FacesUtils.addErrorMessage(null, "Ошибка валидации модуля");
                return;
            }

            final Module module = ModuleAdapter.convertToModule(moduleBean);
            if (module == null) {
                // todo сделать через файл messages
                FacesUtils.addErrorMessage(null, "Ошибка конвертации модуля");
                return;
            }

            final ModuleService modulesService = (ModuleService) FacesUtils.getSpringBean(WebConst.MODULE_SERVICE);
            Module editable = modulesService.editModule(module);

            if (editable != null) {
                // сохранено успешно
                // todo сделать через файл messages
                FacesUtils.addInfoMessage(null, "Модуль изменен успешно");
            } else {
                // сохранено не успешно
                // todo сделать через файл messages
                FacesUtils.addErrorMessage(null, "Ошибка изменения модуля");
            }
        }
    }
}
